# 时间 2021年8月2日
# 作者：鲍发户
# 内容：爬取中国福利彩与大乐彩票号存入数据库中
# 为什么要构建一个类呢？
from lxml import etree

from selenium import webdriver

import requests

import time

import pymysql


class CaipiaoSipder(object):
    # 这个类未完成使命，等我进修之后再来完善一下动态爬取内容
    # 类属性，以及r的作用后续再说
    driver_path = r"D:\develop\chromedriver\chromedriver.exe"

    # 定义初始化内容
    def __init__(self):
        # 启动机器人
        self.driver = webdriver.Chrome(executable_path=CaipiaoSipder.driver_path)
        # 要爬取的网站URL
        self.url = 'https://www.lottery.gov.cn/kj/kjlb.html?dlt'

    # 定义运行方法
    def run(self):
        # 请求页面
        self.driver.get(self.url)
        # 拿到页面数据
        source = self.driver.page_source
        self.parse_page(source)

    # 拿到页面内容之后需要进行解析
    def parse_page(self, source):
        # 使用xml进行解析
        html = etree.HTML(source)
        # 解析完之后拿到当前页面的彩票号
        nums = html.xpath("//div")
        print(nums)


# 创建新的类，这个类完成内容是从彩宝网站爬取双色球号码
class CaibaoSpider(object):
    # 定义初始化信息
    BASE_DOMAIN = 'https://www.caibow.com/'
    HEADERS = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Referer': 'https://www.caibow.com/ssq/kj/p1/'
    }

    # 开始地址
    def __init__(self):
        # 其实页数可以写成自动获取的，但是我比较懒以后有机会的话会完善，但是现在的目标为爬完即可。
        # 福利彩地址183页
        self.url = 'https://www.caibow.com/ssq/kj/p{}/'
        # 大乐透地址144页
        self.url1 = 'https://www.caibow.com/dlt/kj/p{}/'

    # 获取每一页
    def run(self):
        # 总共182页
        for i in range(1, 183):
            # print(self.url.format(i))
            time.sleep(1)
            self.parse_page(self.url.format(i))

        for i in range(1, 145):
            time.sleep(1)
            self.parse_page1(self.url1.format(i))

    # 执行爬虫
    def parse_page(self, url):
        # 获取页面内容
        name = "福利彩"
        resp = requests.get(url, self.HEADERS)
        # 对页面进行解析
        text = resp.text
        # 将内容结构化
        tree = etree.HTML(text)
        # 解析网页内容
        # 期号以及开奖日期
        num_dates = tree.xpath("//span[@class='fr fz_14']/text()")
        # 对爬取内容进行分析，数组里面是每一组红球的数字，每6个为一组
        red_nums = tree.xpath(
            "//div[@class='pd_10_20 bb_das']//span[@class='fl all_ball red_ball color_white mr10']/text()")
        # 蓝色的为每组一个
        blue_nums = tree.xpath(
            "//div[@class='pd_10_20 bb_das']//span[@class='fl all_ball blue_ball color_white mr10']/text()")
        # 将爬取的数据拼接成6+1形式放入数组nums中形式为[['','','',''],['','','',''],]
        # 将大数组分为小数组写法，红球步数为6
        step = 6
        # 红球将数据分为6个一组
        num = [red_nums[x:x + step] for x in range(0, len(red_nums), step)]
        # 加入篮球数据
        for x in range(0, len(blue_nums)):
            num[x].append(blue_nums[x])
            caipiao = ' '.join(num[x])
            riqi = ''.join(num_dates[x])
            print(name, riqi, caipiao)
            print(name, type(riqi), type(caipiao))
            self.insert_db(name, riqi, caipiao)

    # 执行爬虫
    def parse_page1(self, url):
        name = "大乐透"
        # 获取页面内容
        resp = requests.get(url, self.HEADERS)
        # 对页面进行解析
        text = resp.text
        # 将内容结构化
        tree = etree.HTML(text)
        # 解析网页内容
        # 期号以及开奖日期
        num_dates = tree.xpath("//span[@class='fr fz_14']/text()")
        # 对爬取内容进行分析，数组里面是每一组红球的数字，每6个为一组
        red_nums = tree.xpath(
            "//div[@class='pd_10_20 bb_das']//span[@class='fl all_ball red_ball color_white mr10']/text()")
        # 蓝色的为每组一个
        blue_nums = tree.xpath(
            "//div[@class='pd_10_20 bb_das']//span[@class='fl all_ball blue_ball color_white mr10']/text()")
        # 将爬取的数据拼接成5+2形式放入数组nums中形式为[['','','',''],['','','',''],]
        # 将大数组分为小数组写法，红球步数为6
        step1 = 5
        step2 = 2
        # 红球将数据分为5个一组
        num1 = [red_nums[x:x + step1] for x in range(0, len(red_nums), step1)]
        num2 = [red_nums[x:x + step2] for x in range(0, len(blue_nums), step2)]
        # 加入篮球数据
        for x in range(0, len(num1)):
            for i in range(2):
                num1[x].append(num2[x][i])
            riqi = ''.join(num_dates[x])
            caipiao = ' '.join(num1[x])
            print(name, riqi, caipiao)
            print(name, type(riqi), type(caipiao))
            self.insert_db(name, riqi, caipiao)

    def insert_db(self, name, date, num):
        # 连接数据库
        db = pymysql.connect(
            host="127.0.0.1",
            user='root',
            password='root',
            database='caipiao',
            port=3306
        )
        cursor = db.cursor()
        sql = """
        insert into nums(
            id,name,date,num
          ) 
          values(null,%s,%s,%s);
        """
        cursor.execute(sql, (name, date, num))
        db.commit()
        db.close()


if __name__ == '__main__':
    # 执行类方法
    spider = CaibaoSpider()
    spider.run()
